home *** CD-ROM | disk | FTP | other *** search
/ Merciful 4 / Merciful - Disc 4.iso / software / p / psychotoads.dms / psychotoads.adf / a4 < prev    next >
Text File  |  1989-03-31  |  31KB  |  927 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.                             4: BASIC PRINCIPLES                             35
  10.                        -----------------------------
  11.  
  12.  
  13. This chapter discusses the ground rules used to construct AMOS Basic
  14. programs and shows you how to improve your programming style with the
  15. help of AMOS Basic procedures.
  16.  
  17.  
  18. Variables
  19. =========
  20. Variables are the names used to refer to storage locations inside a
  21. computer. These locations hold the results of the calculations
  22. performed in one of your programs.
  23.  
  24.   The choise of variable names is entirely up to you, and can include
  25. any string of letters or numbers. There are only a couple of
  26. restrictions. All variable names MUST begin with a letter and cannot
  27. commence with an existing AMOS Basic instruction. However it is
  28. perfectly permissible to use these keywords inside a name. So variables
  29. such as VPRINT or SCORE are fine.
  30.  
  31.   Variable names must be continuous, and may not contain embedded
  32. spaces. If a space is required, it's a possible to substitute a "_"
  33. character instead.
  34.  
  35. Here are some examples of illegal names. The illegal bits are
  36. underlined to make things clearer.
  37.  
  38.         WHILE$, 5C, MODERN#, TOAD
  39.         -----   -   ---      --
  40.  
  41.  
  42. Types of variables
  43. ==================
  44. AMOS Basic allows you to use three different types of variables in your
  45. programs.
  46.  
  47. Integers
  48. --------
  49. Unlike most other Basics, AMOS initially assumes that all variables are
  50. integers. Integers are whole numbers such as 1,3 or 8, and are ideal
  51. for holding the values used in your games.
  52.  
  53.   Since integer arithmetic is much faster than the normal floating
  54. point operations, using integers in you programs can lead to dramatic
  55. improvements in speed. Each integer is stored in four bytes and can
  56. range from -147'483'648 to +147'483'648. Examples of integer variables:
  57.  
  58.         A, NUMBER, SCORE, LIVES
  59.  
  60.  
  61. Real numbers                                                                36
  62. ------------
  63. In AMOS Basic these variables are always followed by a hash (#)
  64. character. Real numbers can hold fractional values such as 3.1 or 1.5.
  65. They correspond directly to the standard variables used in most other
  66. versions of Basic. Each real variable is stored in four bytes and can
  67. range between 1E-14 and 1E-15. All values are accurate to a precision
  68. of seven decimal digits. Examples:
  69.  
  70.         P#, NUMBER#, TEST#
  71.  
  72.  
  73. String variables
  74. ----------------
  75. String variables contain text rather than numbers. They are
  76. distinguished from normal variables by the $ character at the end. The
  77. length of your text can be anything from 0 to 65'500 characters.
  78. Examples of string variables:
  79.  
  80.         NAME$, PATH$, ALIEN$
  81.  
  82.  
  83. Giving a variable a value
  84. =========================
  85. Assigning a value to a variable is easy. Simply choose an appropriate
  86. name and assign it to value using the "=" statement.
  87.  
  88.         VAR=10
  89.  
  90. This loads the variable VAR with a value of 10.
  91.  
  92.         A$="Hello"
  93.  
  94. This assigns string "Hello" to a variable A$.
  95.  
  96.  
  97.  
  98. Arrays
  99. ======
  100. Any list of variables can be combined together in the form of an array.
  101. Arrays are created using the DIM instruction.
  102.  
  103.  
  104.  
  105.                        DIM (dimension an array)
  106.  
  107. DIM var(x,y,z,...)
  108.  
  109. DIM defines a table of variables in your AMOS Basic program. These
  110. tables may have as manu dimensions as you want, but each dimension is
  111. limited to a maximum of 65'000 elements. Example:
  112.  
  113.         Dim A$(10),B(10,10),C#(10,10,10)
  114.  
  115. In order to access an element in the array you simply type the array
  116. name followed by the index numbers. These numbers are separated by
  117. commas and are enclosed between round brackets (). Note that the
  118. element numbers of these arrays always start from zero. Example:
  119.  
  120.         Dim ARRAY(10)
  121.         ARRAY(0)=10:ARRAY(1)=15
  122.         Print ARRAY(1);ARRAY(0)
  123. ( result: 15 10 )
  124.  
  125.  
  126. Constants                                                                   37
  127. =========
  128. Constants are simply numbers or strings which are assigned to a
  129. variable or used in one of your calculations. They are called constants
  130. because they don't charge during the course of your program. The
  131. following values are all constants:
  132.  
  133.         1, 42, 3.141, "Hello"
  134.  
  135. As a default, all numeric constants are treated as integers. Any
  136. floating point assignments to an integer variable are automatically
  137. converted to a whole number before use. Examples:
  138.  
  139.         A=3.141:Print A
  140. ( result: 3)
  141.         Print 19/2
  142. ( result: 9)
  143.  
  144. Constants can also be input using binary or hexadecimal notation.
  145. Binary numbers are signified by preceding them with a % character, and
  146. hexadecimal numbers are denoted by a $ sign. Here's number 255:
  147.  
  148.         Decimal:        255
  149.         Hexadecimal:    $FF
  150.         Binary:         $11111111
  151.  
  152. Note that any numbers you type in AMOS Basic are automatically
  153. converted to special internal format. When you list your program these
  154. numbers are expanded back into their original form. Since AMOS Basic
  155. prints all numbers in a standard way, this will often lead to minor
  156. discrepancies between the number you entered and the number which is
  157. displayed in your listing. However the value of the number will remain
  158. exactly the same. Floating point constants are distinguished from
  159. integers by a decimal point. If this point is not used, the number will
  160. always be assumed to be an integer, even if this number occurs inside a
  161. floating point expression. Take the following example:
  162.  
  163.         For X=1 To 10000
  164.           A#=A#+2
  165.         Next X
  166.  
  167. Every time the expression in this program is evaluated, the "2" will be
  168. laboriously converted into a real number. So this routine will be
  169. inherently slower than the equivalent program below:
  170.  
  171.         For X=1 To 10000
  172.           A#=A#+2.0
  173.         Next X
  174.  
  175. This program executes over 25% faster than the original one because the
  176. constant is now stored directly in floating point format. You should
  177. always remember to place a decimal oint after a floating point constant
  178. even if it is a whole number. Incidentally, if you mix floating point
  179. numbers and integers, the result will always be returned as a real
  180. number. Example:
  181.  
  182.         Print 19.0/2
  183. ( result: 9.5 )
  184.         Print 3.141+10
  185. ( result: 13.141 )
  186.  
  187.  
  188.  
  189. Arithmetic operations                                                       38
  190. =====================
  191.  
  192. The following arithmetic operations can be used in a numeric
  193. expression:
  194.  
  195.         ^       power
  196.         / *     divide and multiply
  197.         MOD     modulo operator (remainder of a division)
  198.         + -     plus and minus
  199.         AND     logical AND
  200.         OR      logical OR
  201.         NOT     logical NOT
  202.  
  203. We've listed these operations in descending order of their priority.
  204. This priority refers to the sequence in which the various sections of
  205. an arithmetic expressions are evaluated. Operations with the highest
  206. priority are always calculated first.
  207.  
  208.  
  209.  
  210.                   INC (add 1 to an integer variable)                        39
  211.  
  212. INC var
  213.  
  214. INC adds 1 to an integer variable using a single 68000 instruction. It
  215. is logically equivalent to the expression var=var+1, but faster.
  216. Example:
  217.  
  218.         A=10:Inc A:Print A
  219. ( result: 11 )
  220.  
  221.  
  222.  
  223.                DEC (subtract 1 from an integer variable)
  224.  
  225. DEC var
  226.  
  227. This instruction subtracts 1 from the integer variable var. Example:
  228.  
  229.         A=2:Dec A:Print A
  230. ( result: 1 )
  231.  
  232.  
  233.  
  234.                       ADD (fast integer addition)
  235.  
  236. ADD v,exp [,base TO top]
  237.  
  238. The standard from of this instruction immediately adds the result of
  239. the expression exp to the integer variable v. It's equivalent to the
  240. line: V=V+EXP
  241.  
  242.   The only significant difference between the two statements is that
  243. ADD performs around 40% faster. Note that the variable v must be an
  244. integer. Example:
  245.  
  246.         Timer=0
  247.         For X=1 To 1000
  248.           Add T,X
  249.         Next X
  250.         Print T,Timer
  251. ( result: 500500 7 )
  252.  
  253. The second version of ADD is a little more complicated. It is
  254. effectively identical to the following code (but faster):
  255.  
  256.         V=V+A
  257.         If V<Base Then V=Top
  258.         If V>Base Then V=Base
  259.  
  260. Example:
  261.         Dim A(10)
  262.         For X=0 To 10:A(X)=X:Next X
  263.         V=0
  264.         Repeat
  265.           Add V,1,1 To 10
  266.           Print A(V)
  267.         Until V=100:rem This is an infinite loop as V is always less
  268.                         than 10!
  269.  
  270. As you can see, ADD is ideal for handing circular or repetitive loops
  271. in your games.
  272.  
  273.  
  274.  
  275. String operations                                                           40
  276. =================
  277. Like most versions of Basic, AMOS will happily allow you to add two
  278. strings together.
  279.  
  280.         A$="AMOS"+" Basic"
  281.         Print A$
  282. ( result: AMOS Basic )
  283.  
  284. But AMOS also lets you perform subtraction as well. This operation
  285. works by removing all occurrences of the second string from the first.
  286.  
  287.         Print "AMOS BASIC"-"AMO"
  288. ( result: S BASIC )
  289.  
  290. Comparisons between two strings are performed on a character by
  291. character basis using the Ascii values of the appropriate letters:
  292.  
  293.         "AA"<"BB"
  294.         "Filename"="Filename"
  295.         "X&">"X#"
  296.         "HELLO"<"hello"
  297.  
  298.  
  299. Parameters                                                                  41
  300. ==========
  301. The values you enter into an AMOS Basic instruction are known as
  302. parameters. i.e
  303.  
  304.         Inc N
  305.         Add A,10
  306.         Ink 1,2,3
  307.  
  308. The parameters in the above instructions are N,A,10,1,2 and 3
  309. respectively. Occasionally, some of the parameters of a command can be
  310. ommitted from an instruction. In this case, any unused values will
  311. automatically be assigned a number by default. Example:
  312.  
  313.         Ink 5,,
  314.  
  315. This changes the ink colour without affecting either the paper or
  316. outline colours.
  317.  
  318.  
  319.  
  320. Line numbers and labels
  321. =======================
  322.  
  323.  
  324. Labels
  325. ======
  326. Labels are just a convenient way of marking a point in your AMOS Basic
  327. programs. They consist of a string of characters formed using the same
  328. rules as AMOS variables. Labels should always be placed at the start of
  329. the line, and must be followed immediately by a ":" character. There
  330. should be no spaces between the label and the colon. Example:
  331.  
  332.         TESTLABEL:
  333.         Print "Hi There!"
  334.         Goto TESTLABEL
  335.  
  336. This program can be aborted by pressing CTRL+C...
  337.  
  338.  
  339.  
  340. Procedures                                                                  42
  341. ==========
  342. Procedures allow you to concentrate your efforts on just one problem at
  343. a time without the distractions provided by the rest of your program.
  344. Once you've written your procedures you can then quickly combine them
  345. in your finished program. AMOS procedures are totally independent
  346. program modules which can have their own program lines, variables, and
  347. even data statements.
  348.  
  349.  
  350.  
  351.               PROCEDURE (create an AMOS Basic procedure)
  352.  
  353. Procedure NAME[parameter list]
  354. :     :
  355. End Proc[Expression]
  356.  
  357. This defines an AMOS Basic procedure called NAME. NAME is a string of
  358. characters which identify the procedure. It is constructed in exactly
  359. the same way as a normal Basic variable. Note that it's perfectly
  360. acceptable t ouse identical names for procedures, variables and labels.
  361. AMOS will automatically work out which object you are referring to from
  362. the context of the line.
  363.  
  364.   Procedures are similar to the GOSUB commands found in earlier
  365. versions of Basic. Here's an example of a simple AMOS procedure:
  366.  
  367.         Procedure ANSWER
  368.           Print "Forty-Two!"
  369.         End Proc
  370.  
  371. See how the procedure has been terminated with an END PROC statement.
  372. You should also note that the Procedure and the End Proc directives are
  373. both placed on their own separate lines. This is compulsory.
  374.  
  375.   If you type the previous procedure into AMOS Basic as it stands, and
  376. attempt to run it, nothing will happen. That's because you haven't
  377. actually called the new procedure from your Basic Program. This can be
  378. achieved by simply entering its name at the appropriate point in the
  379. program. As an example, enter the following line at the start of the
  380. program and run it to see the result of the procedure.
  381.  
  382.         ANSWER
  383.  
  384. IMPORTANT! When you are using several procedures on the same line, it's
  385. advisable to add an extra space at the end of each statement. This will
  386. avoid the risk of the procedure being confused with a label. For
  387. example:
  388.  
  389.         TEST : TEST : TEST      Performs the test three times.
  390.         TEST:TEST:TEST          Defines Label TEST and executes test 2x
  391.  
  392. Alternatively, you can preclude your Procedure calls with a Proc
  393. statement like so:
  394.  
  395.         Proc ANSWER
  396.  
  397. Example:
  398.  
  399.         Proc ANSWER
  400.         Procedure ANSWER
  401.           Print "Forty-Two"
  402.         End Proc
  403.  
  404. If you run this program again, the procedure will be entered, and the
  405. answer will be printed out on the screen. Although the procedure
  406. definition is positioned at the end of the program, it's possible to
  407. place it absolutely anywhere. Whenever AMOS encouters a Procedure
  408. statement, it installs the procedure and immediately jumps to the final
  409. End Proc. This means there is no danger of accidentally executing your
  410. procedure by mistake. Once you've created a procedure, and tested it to
  411. your satisfaction, you can suppress it in your listings using the fold
  412. option from the main menu.
  413.  
  414.   These folding procedures reduce the apparent complexity of your
  415. listings and allow you to debug large programs without the distractions
  416. of unimportant details. You can restore your procedure listings to the
  417. screen at any time by selecting the 'unfold menu option'.
  418.  
  419.  
  420. Local and global variables                                                  43
  421. --------------------------
  422. All the variables you define inside your procedures are independent of
  423. any other variables used in your program. These variables are said to
  424. be "local" to your particular procedure. Here's an example which
  425. illustrates this:
  426.  
  427.         A=1000:B=42
  428.         TEST
  429.         Print A,B
  430.         Procedure TEST
  431.         Print A,B
  432.         End Proc
  433.  
  434. It should be apparent that the names A and B refer to completely
  435. different variable depending on whether they are used inside or outside
  436. the procedure TEST. The variables which occur outside a procedure are
  437. "global" and cannot be accessed from within it. Let's take another
  438. example:
  439.  
  440.         Dim A(100)
  441.         For V=1 To 100: A(V)=V:Next V
  442.         TEST_FLAG=1
  443.         APRINT
  444.         End
  445.         Procedure APRINT
  446.           If TEST_FLAG=1
  447.            For P=1 To 100
  448.              Print A(P)
  449.            Next P
  450.           Endif
  451.         End Proc
  452.  
  453. This program may look pretty harmess but it contains two fatal errors.
  454.  
  455.   Firstly, the value of TEST_FLAG inside the procedure will always have
  456. a value of zero. So the loop between the IF and the ENDIF will never be
  457. performed. That's because the version of TEST_FLAG within the procedure
  458. is completely separate from the copy defined in the main program. Like
  459. all variables, it's automatically assigned to zero the fist time it's
  460. used.
  461.  
  462.   Furthermore, the program won't even run! Since the global array a()
  463. has been defined outside ARPINT, AMOS Basic will immediately report an
  464. "array not dimensioned" error at the line:
  465.  
  466.         Print A(P)
  467.  
  468. This type of error is extremely easy tomake. So it's vital that you
  469. treat procedures as separate programs with their own independent set of
  470. variables and instrcutions.
  471.  
  472.   There are a couple of extensions to this system which make it easy
  473. for you to transfer information between a procedure and your main
  474. program. Once you're familiar with these commands you'll have few
  475. problems in using procedures successfully in your programs.
  476.  
  477.  
  478. Parameters and procedures                                                   44
  479. -------------------------
  480. One possibility is to include a list of "parameter definitions" in your
  481. procedure. This creates a group of local variables which can be loaded
  482. directly from the main program. Here's an example:
  483.  
  484.         Procedure HELLO[NAME$]
  485.           Print "Hello ";NAME$
  486.         End Proc
  487.  
  488. The value to be loaded into NAME$ is entered between square brackets as
  489. part of the procedure call. So the HELLO procedure could be performed
  490. in the following ways:
  491.  
  492.         Rem Loads N$ into NAME$ and enters procedure
  493.         Input "What's your name";n$
  494.         HELLO[N$]
  495.         HELLO["Stephen"]
  496.  
  497. As you can see, the parameter system is general purpose and works
  498. equally well with either variables or constants. Only the type of the
  499. variables are significant.
  500.  
  501.   This process can be used to transfer integer, real or string
  502. variables. However you cannot pass entire arrays with this function. If
  503. you want to enter several parameters you should separate your variables
  504. using commas. For example:
  505.  
  506.         Procedure POWER[A,B]
  507.         Procudure MERGE[A$,B$,C$]
  508.  
  509. These procedures might by called using lines like:
  510.  
  511.         POWER[10,3]
  512.         MERGE["One","Two","Three"]
  513.  
  514.  
  515. Shared variables                                                            45
  516. ----------------
  517. Another way of passing data between a procedure and the main program is
  518. to use the SHARED instruction.
  519.  
  520.  
  521.  
  522.               SHARED (defina a list of global variables)
  523.  
  524. SHARED variable list
  525.  
  526. SHARED is placed inside a procedure definition and takes a list of AMOS
  527. Basic variables separated by commas. These variables are now treated as
  528. global variables., and can be accessed directly from the main program.
  529. Any arrays which you declare in this way should of course have been
  530. previously dimensioned in your main program. Example:
  531.  
  532.         A=1000:B=42
  533.         TEST
  534.         Print A,B
  535.         Procudure Test
  536.           Shared A,B
  537.           A=A+B:B=B+10
  538.         End Proc
  539.  
  540. TEST can now read and write information to the global variables A and
  541. B. If you want to share an array you should define it like so:
  542.  
  543.         Shared A(),B#(),C$() : Rem Share arrays A,B# and C$
  544.  
  545.  
  546.  
  547.               GLOBAL (declare a list of global variables
  548.                         from the main program)
  549.  
  550. GLOBAL variable list
  551.  
  552. When you're writing a large program, it's commonplace for a number of
  553. procedures to share the same set of global variables. This provides a
  554. simple method of transferring large amounts of information between your
  555. various procedures. In order to simplify this process, we've included a
  556. single command which can be used directly in your main program. GLOBAL
  557. defines a list variables which can be accessed anywhere inside your
  558. Basic program, without the need for an explicit SHARED statement in
  559. your procedure.
  560.  
  561.  
  562. Returning values from a procedure                                           46
  563. ---------------------------------
  564. If a procedure needs to return a value which is only local to itself,
  565. it must use the following command so that it can inform the calling
  566. PROCEDURE command where to find the local variable
  567.  
  568.  
  569.  
  570.               PARAM (return a parameter from a procedure)
  571.  
  572. PARAM
  573.  
  574. The PARAM functions provide you with a simple way of returning a result
  575. from a procedure. They take the result of an optional expression in the
  576. END PROC statement, and return it in one of the variables PARAM,
  577. PARAM#, or PARAM$ depending on its type. Example:
  578.  
  579.         MERGE_STRINGS["Amos"," ","Basic"]
  580.         Print PARAM$
  581.         Procedure MERGE_STRINGS[A$,B$,C$]
  582.           Print A$,B$,C$
  583.         End Proc
  584.  
  585. Note that END PROC may only return a single parameter in this way. The
  586. PARAM functions will always contain the result of the most recently
  587. executed procedure. Here's another example, this time showing the use
  588. of the PARAM# function.
  589.  
  590.         CUBE[3,0]
  591.         Print Param#
  592.         Procedure CUBE[A#]
  593.           C#=CUBE#*CUBE#*CUBE#
  594.         EndProc[C#]
  595.  
  596.  
  597. Leaving a procedure                                                         47
  598. -------------------
  599.  
  600.  
  601.                POP PROC (leave a procedure immediately)
  602.  
  603. POP PROC
  604.  
  605. Normally, procedures will only return to the main program when the END
  606. PROC instruction is reached. Sometimes, however, you need to exit a
  607. procedure in a hurry. IN this case you can use the POP PROC function to
  608. exit immediately.
  609.  
  610.  
  611. Local DATA statements
  612. ---------------------
  613. Any data statements defined inside one of your procedures are held
  614. completely separately from those in the main program. This means each
  615. procedure can have its own individual data areas.
  616.  
  617.  
  618. Hints and tips
  619. --------------
  620. Here are a few guidelines which will help you make the most out of your
  621. AMOS Basic procedures:
  622.  
  623.   * It's perfectly legal for a proceduces to call itself, but this
  624.     recursion is limited by the amount of space used to store the local
  625.     variables. If your program runs out of memory you'll get an
  626.     appropriate error.
  627.  
  628.   * All local variables are automatically discarded after the procedure
  629.     has finished executing.
  630.  
  631.  
  632. Memory banks                                                                48
  633. ============
  634.  
  635. AMOS Basic includes a number of powerful facilities for manipulating
  636. sprites, bobs and music. The data required by these functions needs to
  637. be stored along with the Basic program. AMOS Basic uses a special set
  638. of 15 sections of memory for this purpose called "banks".
  639.  
  640.   Each bank is referred to by a unique number ranging from 1 to 15.
  641. Many of these banks can be used for all types of data, but some are
  642. dedicated solely to one sort of information such as sprite definitions.
  643. All sprite images are stored in bank 1. They can be loaded into memory
  644. using a line like:
  645.  
  646.         Load "AMOS_DATA:Sprites/Octopus.abk"
  647.  
  648. There are two different forms of memory bank: Permanent and temprorary.
  649. Permanent banks only need to be defined once, and are subsequently
  650. saved along with your program automatically. Temporary banks are much
  651. more volatile and are reinitialized every time a program is run.
  652. Furthermore, unlike permanent banks, temporary banks can be erased from
  653. memory using the CLEAR command.
  654.  
  655. Types of memory bank
  656. --------------------
  657. AMOS Basic supports the following types of memory bank:
  658.  
  659.         Class     Stores                      Restrictions  Type
  660.         -----     ------                      ------------  ----
  661.         Sprites   Sprite or bob definitions   Only bank 1   Permanent
  662.         Icons     Holds icon definitions      Only bank 2   Permanent
  663.         Music     Contains sound track data   Only bank 3   Permanent
  664.         Amal      Used for AMAL data          Only bank 4   Permanent
  665.         Samples   The Sample Data             banks 1-15    Permanent
  666.         Menu      Stores MENU definition      banks 1-15    Permanent
  667.         Chip work Temporary workspace         banks 1-15    Temporary
  668.         Chip data Permanent workspace         banks 1-15    Permanent
  669.         Fast work Temporary workspace         banks 1-15    Temporary
  670.         Fast data Permanent workspace         banks 1-15    Permanent
  671.  
  672.  
  673.  
  674.                        RESERVE (reserve a bank)                             49
  675.  
  676. RESERVE AS type,bank,length
  677.  
  678. The banks used by your sprites or bobs are allocated automatically by
  679. AMOS. The RESERVE command allows you to create any other banks which
  680. you might require. Each different type of bank has its own unique
  681. version of the RESERVE instruction.
  682.  
  683. RESERVE AS WORK bankno,length
  684.  
  685. Reserves "length" bytes for use as a temporary workspace. Whenever
  686. possible this memory area will be allocated using fast memory, so you
  687. shoudn't call this command in conjunction with instructions which need
  688. to access to Amiga's blitter chip.
  689.  
  690. RESERCE AS CHIP WORK bankno,length
  691.  
  692. Allocates a workspace of size "length" using chip ram. You can check
  693. whether there's enough chip ram available with the CHIP FREE function.
  694.  
  695. RESERCE AS CHIP DATA bankno,length
  696.  
  697. Reserves "length" bytes of memory from chip ram. This bank will be
  698. automatically saved along with your AMOS programs.
  699.  
  700.   Bank may be any number between 1 and 15. Since banks 1 to 5 are
  701. normally reserved by the system, it's wisest to leave them alone. Note
  702. that the only limit to the length of a bank is the amount of available
  703. memory.
  704.  
  705.  
  706.  
  707.                    LISTBANK (list the banks in use)
  708.  
  709. LISTBANK lists the numbers of the banks currently reserved by a
  710. program, along with their location and size. The listing is produced in
  711. the following format:
  712.  
  713.         Number    Type    Start    Length
  714.  
  715. Normally the length of a bank is returned in bytes, but in case of
  716. sprites and icons the value represents the total number of images in
  717. the bank instead. The reason for this is that the storage of each image
  718. can be anywhere in the Amiga's memory, the bank is therefore not a
  719. continuous block of memory. So don't BSAVE a sprite bank, simply use
  720. SAVE "filename.abk"
  721.  
  722. Deleting banks                                                              50
  723. --------------
  724. During the course of a program you may need to clear some banks from
  725. the memory so as to load in additional data. Sprites may need to change
  726. for a new part of a game or a special piece of music is required to be
  727. played. The ERASE command gives you quick control for data deletion.
  728.  
  729.  
  730.  
  731.                          ERASE (delete a bank)
  732.  
  733. ERASE b
  734.  
  735. ERASE deletes the contents of a memory bank. The bank number b can
  736. range from 1 to 15. Note that any memory used by this bank is
  737. subsequently freed for use by your program.
  738.  
  739.  
  740. Bank parameter functions
  741. ------------------------
  742. If you want to have direct access to the bank data using commands such
  743. as poke, doke and loke then use these commands to find a bank's address
  744. in memory and its size.
  745.  
  746.  
  747.  
  748.                =START (get the start address of a bank)
  749.  
  750. s=START(b)
  751.  
  752. This function returns the start address of bank unmber b. Once it's
  753. been removed, the location of the bank will never subsequently change.
  754. So the result of this function will remain fixed for the lifetime of
  755. the bank. Example:
  756.  
  757.         Reserve As Work 3,2000
  758.         Print Start(3)
  759.  
  760.  
  761.  
  762.                   =LENGTH (Get the length of a bank)
  763.  
  764. l=length(b)
  765.  
  766. The LENGTH function returns the length in bytes of bank number b. If
  767. the bank contains sprites then the number of sprites or icons will be
  768. returned instead. A value of zero indicates that bank b does not exist.
  769. Exaple:
  770.  
  771.         Reserve as work 6,1000
  772.         Print Length(6)
  773.         Erase 6
  774.         Print Length(6)
  775.  
  776.  
  777. Loading and saving banks                                                    51
  778. ------------------------
  779. Some programs will require many banks of information, a good example is
  780. an adventure. This would need to load various graphics and sounds for
  781. the different locations within the games domain. An Amiga 500 would
  782. have great difficulty holding all this data at once and so it's best to
  783. simply load the data at the appropriate time of use.
  784.  
  785.  
  786.  
  787.                      LOAD (Load one or more banks)
  788.  
  789. LOAD "filename"[,n]
  790.  
  791. The effect of this command varies depending on the type of file you are
  792. loading. If the file holds several banks, then ALL current memory banks
  793. will be erased before the new banks are loaded from the disc. However
  794. if you're loading just a single bank, only this bank will replaced. The
  795. optional destination point specifies the bank which is to be loaded
  796. with your data. If it's omitted, then the data will be loaded into the
  797. bank from which it was originally saved.
  798.  
  799.   Sprite banks are treated slightly differently. In this case the
  800. parameter n toggles between two separate loading modes. If n is omitted
  801. or is assigned a value of zero, the current bank will completely
  802. overwritten by the new sprites. Any other value for n forces the new
  803. sprites to be *appended* to this bank. This allows you to combine
  804. several sprite files into the same program. Example:
  805.  
  806.         LOAD "AMOS_DATA:Sprites/Octopus.abk"
  807.  
  808.  
  809.  
  810.  
  811.               SAVE (Save one or more banks onto the disc)
  812.  
  813. SAVE "filenami"[,n]
  814.  
  815. The SAVE command saves your memory banks onto the disc. There are two
  816. possible formats:
  817.  
  818.         SAVE "filename.ABK"
  819.  
  820. This saves *ALL* currently defined banks into a single file onto your
  821. disc.
  822.  
  823.         SAVE "filename.ABK",n
  824.  
  825. The expanded form just saves memory bank number n. One should also be
  826. sure to use the extension ABK at the end of the filename as this will
  827. ensure you can identify that the file contains one or more memory
  828. banks.
  829.  
  830.  
  831.  
  832.                    BSAVE (Save an unformatted block
  833.                            in binary format)
  834.  
  835. BSAVE file$, start TO end
  836.  
  837. The memory stored between "start" and "end" is saved on the disc in
  838. file$. This data is saved with no special formatting. Example:
  839.  
  840.         BSAVE "Test",Start(7) TO Start(7)+Length(7)
  841.  
  842. The above example saves the data in memory bank 7 to disc. The
  843. difference between this file and a saved file as a normal bank is that
  844. SAVE writes out a special blank header that contains information
  845. concerning the bank. This header is not present with a BSAVED file so
  846. it cannot be loaded using LOAD.
  847. WARNING: The sprites an icon banks are not stored as one chunk of
  848. memory. Each object can reside anywhere in memory. Because AMOS uses
  849. this flexible system of data storage you simply can't save the memory
  850. bank using BSAVE.
  851.  
  852.  
  853.  
  854.                   BLOAD (load binary information into                       52
  855.                      a specified address or bank)
  856.  
  857. BLOAD file$, addr
  858.  
  859. The BLOAD command loads a file of binary data into memory. It does not
  860. alter the incoming information in any way. There are two forms of this
  861. function.
  862.  
  863.         BLOAD file$, addr
  864.  
  865. File$ will be loaded from the disc into the address addr.
  866.  
  867.         BLOAD file$, bank
  868.  
  869. File$ will be loaded into bank. This bank must have been previously
  870. reserved, otherwise an error will be generated. Also be sure not to
  871. load a file that is larger than the reserved bank, otherwise it will
  872. over run the bank and start corrputing other areas of memory!
  873.  
  874.  
  875. Memory fragmentation
  876. --------------------
  877. Sometimes, after a busy editing session, you may get an "Out of Memory"
  878. error, even though the information line implie
  879.  
  880. Finding space for your variables
  881. --------------------------------
  882. As a default, all variables are stored in a memory area of exactly 8k
  883. in length. Although this may seem incredibly meagre, it's easily
  884. capable of holding around 2 pages of normal text, or 2000 numbers.
  885. We've intentionally set it as small as possible so as to maximize the
  886. amount of space available for your screens and memory banks.
  887.  
  888.  
  889.  
  890.             SET BUFFER (set the size of the variable area)
  891.  
  892. SET BUFFER n
  893.  
  894. Sets the size of the variable area in your current program to "n"
  895. kilobytes. This must be the FIRST instruction in your program
  896. (excluding Rems). Otherwise you'll get an appropriate error message.
  897. For an example of this feature see EXAMPLE 4.1  in the MANUAL folder.
  898.  
  899.   SET BUFFER should be used in your program whenever you get an "out of
  900. string space error". Increase the value in 5k increments until the
  901. error disappears. If you run out of memory during this process, you'll
  902. propably need to reduce the requirements of your program in some way.
  903. See the CLOSE WORKBENCH and CLOSE EDITOR commands for more details.
  904.  
  905.  
  906.  
  907.       =FREE (return the amount of free mem. in the variable area)
  908.  
  909. f=FREE
  910.  
  911. FREE returns the number of bytes which are currently available to hold
  912. your variables. This value can be increased as required using the
  913. previous SET BUFFER command. 
  914.  
  915.   Whenever FREE is called, the variable area is reorganized to provide
  916. the maximum space for your variables. This process is known as "garbage
  917. collection", and is normally performed automatically.
  918.  
  919.   Due to the power of AMOS Basic, the entire procedure is usually
  920. accomplished practically instantaneously. But if your variable area is
  921. bery large and you're using a lot of strings, the garbage collection
  922. routine might take several seconds to complete. Conceivably, this could
  923. lead to a unexpected delay in the execution of your programs. Since the
  924. garbage collection is totally essential, you may need to add an
  925. explicit call to the FREE command when it will cause the least amount
  926. of harm in your program.
  927.